<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="UTF-8">
<title>字符 ↔ 数字格式转换 API 速查表</title>
<style>
    body { font-family: Arial, sans-serif; margin: 20px; background: #f9f9f9; }
    h1 { text-align: center; }
    table { border-collapse: collapse; width: 100%; margin-top: 15px; }
    th, td { border: 1px solid #ccc; padding: 8px; text-align: left; }
    th { background-color: #444; color: #fff; }
    code { background: #eee; padding: 2px 4px; border-radius: 3px; }
    .search-box { margin: 10px 0; padding: 5px; width: 300px; }
    .kernel { background-color: #d4f4dd; }
    .user { background-color: #dce9ff; }
    .shared { background-color: #fff8d6; }
</style>
<script>
function tableSearch(inputId, tableId) {
    var input = document.getElementById(inputId);
    var filter = input.value.toLowerCase();
    var table = document.getElementById(tableId);
    var trs = table.getElementsByTagName("tr");

    for (var i = 1; i < trs.length; i++) { // skip header
        var cells = trs[i].getElementsByTagName("td");
        var match = false;
        for (var j = 0; j < cells.length; j++) {
            if (cells[j].textContent.toLowerCase().indexOf(filter) > -1) {
                match = true;
                break;
            }
        }
        trs[i].style.display = match ? "" : "none";
    }
}
</script>
</head>
<body>

<h1>字符 ↔ 数字格式转换 API 速查表</h1>
<p style="text-align:center;">搜索关键词可匹配函数名、特性、原型、备注等</p>

<input type="text" id="searchAPI" class="search-box" placeholder="搜索API..." onkeyup="tableSearch('searchAPI','apiTable')">

<table id="apiTable">
<tr>
    <th>方向</th>
    <th>函数名</th>
    <th>原型</th>
    <th>作用</th>
    <th>返回值</th>
    <th>适用范围</th>
    <th>备注</th>
</tr>

<!-- 字符串 -> 整数 -->
<tr class="user"><td>字符串 → 整数</td><td>atoi</td>
<td><code>int atoi(const char *nptr);</code></td>
<td>将字符串转换为 int</td>
<td>整数</td><td>用户态</td><td>不检查错误，遇非法字符停止</td></tr>

<tr class="user"><td>字符串 → 整数</td><td>atol</td>
<td><code>long atol(const char *nptr);</code></td>
<td>转换为 long</td>
<td>整数</td><td>用户态</td><td>不检查错误</td></tr>

<tr class="user"><td>字符串 → 整数</td><td>atoll</td>
<td><code>long long atoll(const char *nptr);</code></td>
<td>转换为 long long</td>
<td>整数</td><td>用户态</td><td>不检查错误</td></tr>

<tr class="shared"><td>字符串 → 整数</td><td>strtol</td>
<td><code>long strtol(const char *nptr, char **endptr, int base);</code></td>
<td>按进制转换</td>
<td>转换值</td><td>共用</td><td>可检测溢出和非法输入</td></tr>

<tr class="shared"><td>字符串 → 整数</td><td>strtoul</td>
<td><code>unsigned long strtoul(const char *nptr, char **endptr, int base);</code></td>
<td>按进制转换</td>
<td>转换值</td><td>共用</td><td>同上</td></tr>

<tr class="shared"><td>字符串 → 整数</td><td>strtoll</td>
<td><code>long long strtoll(const char *nptr, char **endptr, int base);</code></td>
<td>按进制转换</td>
<td>转换值</td><td>共用</td><td>可检测溢出</td></tr>

<tr class="shared"><td>字符串 → 整数</td><td>strtoull</td>
<td><code>unsigned long long strtoull(const char *nptr, char **endptr, int base);</code></td>
<td>按进制转换</td>
<td>转换值</td><td>共用</td><td>可检测溢出</td></tr>

<tr class="shared"><td>字符串 → 整数</td><td>strtoimax</td>
<td><code>intmax_t strtoimax(const char *nptr, char **endptr, int base);</code></td>
<td>最大宽度有符号整型</td>
<td>转换值</td><td>共用</td><td>stdint.h</td></tr>

<tr class="shared"><td>字符串 → 整数</td><td>strtoumax</td>
<td><code>uintmax_t strtoumax(const char *nptr, char **endptr, int base);</code></td>
<td>最大宽度无符号整型</td>
<td>转换值</td><td>共用</td><td>stdint.h</td></tr>

<tr class="user"><td>字符串 → 整数</td><td>sscanf</td>
<td><code>int sscanf(const char *str, const char *fmt, ...);</code></td>
<td>按格式解析字符串</td>
<td>成功匹配的项数</td><td>用户态</td><td>功能强，需注意安全</td></tr>

<!-- 字符串 -> 浮点 -->
<tr class="user"><td>字符串 → 浮点</td><td>atof</td>
<td><code>double atof(const char *nptr);</code></td>
<td>转换为 double</td>
<td>浮点数</td><td>用户态</td><td>无错误检查</td></tr>

<tr class="shared"><td>字符串 → 浮点</td><td>strtof</td>
<td><code>float strtof(const char *nptr, char **endptr);</code></td>
<td>转换为 float</td>
<td>浮点数</td><td>共用</td><td>受 locale 影响</td></tr>

<tr class="shared"><td>字符串 → 浮点</td><td>strtod</td>
<td><code>double strtod(const char *nptr, char **endptr);</code></td>
<td>转换为 double</td>
<td>浮点数</td><td>共用</td><td>受 locale 影响</td></tr>

<tr class="shared"><td>字符串 → 浮点</td><td>strtold</td>
<td><code>long double strtold(const char *nptr, char **endptr);</code></td>
<td>转换为 long double</td>
<td>浮点数</td><td>共用</td><td>受 locale 影响</td></tr>

<!-- 数字 -> 字符串 -->
<tr class="user"><td>数字 → 字符串</td><td>sprintf</td>
<td><code>int sprintf(char *str, const char *fmt, ...);</code></td>
<td>格式化到缓冲区</td>
<td>字节数</td><td>用户态</td><td>不安全，可能溢出</td></tr>

<tr class="shared"><td>数字 → 字符串</td><td>snprintf</td>
<td><code>int snprintf(char *str, size_t size, const char *fmt, ...);</code></td>
<td>安全格式化</td>
<td>欲写入字节数</td><td>共用</td><td>推荐</td></tr>

<tr class="user"><td>数字 → 字符串</td><td>asprintf</td>
<td><code>int asprintf(char **strp, const char *fmt, ...);</code></td>
<td>分配并格式化输出</td>
<td>字节数</td><td>用户态(GNU)</td><td>自动malloc</td></tr>

<tr class="user"><td>数字 → 字符串</td><td>gcvt</td>
<td><code>char *gcvt(double number, int ndigit, char *buf);</code></td>
<td>双精度→字符串</td>
<td>buf指针</td><td>用户态</td><td>浮点转换</td></tr>

<!-- 内核专用 -->
<tr class="kernel"><td>字符串 → 数字</td><td>kstrtol</td>
<td><code>int kstrtol(const char *s, unsigned int base, long *res);</code></td>
<td>安全转换→long</td>
<td>0成功，负值错误码</td><td>内核</td><td>替代strict_strtol</td></tr>

<tr class="kernel"><td>字符串 → 数字</td><td>kstrtoul</td>
<td><code>int kstrtoul(const char *s, unsigned int base, unsigned long *res);</code></td>
<td>安全转换→unsigned long</td>
<td>0或错误码</td><td>内核</td><td>推荐</td></tr>

<tr class="kernel"><td>字符串 → 数字</td><td>kstrtoint/kstrtouint</td>
<td><code>int kstrtoint(const char *s, unsigned int base, int *res);</code></td>
<td>安全转换→int</td>
<td>0或错误码</td><td>内核</td><td>推荐</td></tr>

<tr class="kernel"><td>字符串 → 数字</td><td>kstrtoll/kstrtoull</td>
<td><code>int kstrtoll(const char *s, unsigned int base, long long *res);</code></td>
<td>安全转换→long long</td>
<td>0或错误码</td><td>内核</td><td>推荐</td></tr>

<tr class="kernel"><td>数字 → 字符串</td><td>scnprintf</td>
<td><code>int scnprintf(char *str, size_t size, const char *fmt, ...);</code></td>
<td>安全格式化写入</td>
<td>实际写入字节数</td><td>内核</td><td>推荐替代sprintf</td></tr>

<tr class="kernel"><td>数字 → 字符串</td><td>kasprintf</td>
<td><code>char *kasprintf(gfp_t gfp, const char *fmt, ...);</code></td>
<td>分配并格式化</td>
<td>新分配字符串指针</td><td>内核</td><td>推荐</td></tr>
</table>

</body>
</html>